{***************************************************************
    SpyGestion  Copyright (C) 2008 Christophe KOALI <nature2gas@gmail.com>
    
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
    
****************************************************************}
unit modParsingClassIFlotte2;

interface

uses modParsingClassBase,
     modBaseType,
     Classes,
     sFonctionsChaines,
     SysUtils,
     Windows,



     LibXmlParser;




const
    CNT_FLOTTE2_IN_GALAXYCIBLE = '<<galaxy>>';
    CNT_FLOTTE2_IN_SYSTEMCIBLE = '<<system>>';
    CNT_FLOTTE2_IN_PLANETPOSCIBLE = '<<planetpos>>';
    CNT_FLOTTE2_IN_CIBLETYPE    = '<<cibletype>>';    // lune/ruines/planète voir plus bas pour les constantes de valeur
    CNT_FLOTTE2_IN_SPEEDRATIO   = '<<speedratio>>';   // de 1 à 10 (10=100% et 1=10%)

    CNT_FLOTTE2_VAL_CIBLETYPE_PLANETE = '1';
    CNT_FLOTTE2_VAL_CIBLETYPE_RUINES  = '2';
    CNT_FLOTTE2_VAL_CIBLETYPE_LUNE    = '3';





type
    ////////////////////////////////////////////////////////////////////
    // Page flotte 2, sélection de la destination et de la vitesse
    TParsingFlotte2_ChoixDestination = class(IParsingRedirection)
    private
       //
       // Informations qui vont être extraites
       //

        FDataToPost: string;
        FPageToPost: string;

        // Inutile et évident car la flotte part de la planète actuelle,
        // mais puisqu'il est présent dans les champs hidden, on le capture
        // Cela sert surtout pour le calcul du temps mis
        //FPlaneteDepart: TPlanetLocation;

        // Devrait toujours être à 1, dans le cas contraire il faut déclencher une erreur
        // En réalité, dans l'univers béta les flottes vont 5 fois plus vite
        // et comme par hasard SpeedFactor est à 5
        // c'est probablement une variable interne au jeu, on ne déclenche plus d'erreur
        // mais on rend sa valeur disponible à l'extérieur de la classe
        FSpeedFactor: string;




       //
       // Variables qui vont aider à se repérer dans la page
       //

        FInForm: boolean;


        
        // Doit définir si c'est une lune ou pas à mon avis
        // <input name="thisplanettype" type="hidden" value="1" />


    public
       property DataToPost: string read FDataToPost;
       property PageToPost : string read FPageToPost;

       property SpeedFactor: string read FSpeedFactor;



       /////////////////////////////////////////////////////////////////////////
       // Implémentation de IParsingRedirection

        // initialise l'interface
        procedure Initialisation; override;

        // obtient le résultat d'analyse
        function  GetFinalState: TParsingResultState; override;

        procedure SetFullURLFromBase(const BaseLink: string); override;


        procedure ScanOnStartTag(Sender: TObject; TagName: string; Attributes: TAttrList); override;
        procedure ScanOnEndTag(Sender: TObject; TagName: string); override;
        procedure ScanOnContent(Sender: TObject; Content: string); override;

       //
       /////////////////////////////////////////////////////////////////////////


       // constructor: rien à construire, rien à détruire

    end;


implementation

uses modLanguageParsing,
     sHTMLFonctions,
     modApercuMsg,
     ESBDates,
     modCore;

     
procedure TParsingFlotte2_ChoixDestination.SetFullURLFromBase(const BaseLink: string);
begin
    FPageToPost  := sHTML_Get_URL_Lien(BaseLink, FPageToPost);

    inherited;
end;


procedure TParsingFlotte2_ChoixDestination.ScanOnStartTag(Sender: TObject; TagName: string; Attributes: TAttrList);
var CurrBalise: string;
begin

    TagName := lowercase(TagName);

    if TagName = 'form' then begin
       // <form action="flotten3.php?session=00000" method="POST">

       CurrBalise := Attributes.Value('action');

       FPageToPost := CurrBalise;
       FInForm := true;
       
    end else if FInForm and (TagName = 'input') then begin
        // <input name="thisgalaxy" type="hidden" value="4" />

        CurrBalise := trim(Attributes.Value('type'));

        if SameText(CurrBalise, 'hidden') then begin
           CurrBalise := Attributes.Value('name') + '=' + Attributes.Value('value');

           if FDataToPost = '' then
              FDataToPost := CurrBalise
           else
              FDataToPost := FDataToPost + '&' + CurrBalise;


           CurrBalise := Attributes.Value('name');

           if SameText(CurrBalise, 'speedfactor') then begin
              // Le problème est que l'on ne sait pas si c'est un entier ou un flottant
              // Pour l'instant on vérifie juste si il est bien égale à 1
              FSpeedFactor := trim(Attributes.Value('value'));

              (*
              if FSpeedFactor <> '1' then
                 FError := true;
              *)


           end;


        end else if CurrBalise = '' then begin
           // Simple inputbox
           // On saisie normalement les coordonnées de la planète cible dedans
           // Il y a que trois inputbox de ce type:
           // <input name="galaxy" size="3" maxlength="2" onChange="shortInfo()" onKeyUp="shortInfo()" value="1" />
           // <input name="system" size="3" maxlength="3" onChange="shortInfo()" onKeyUp="shortInfo()" value="4" />
           // <input name="planet" size="3" maxlength="2" onChange="shortInfo()" onKeyUp="shortInfo()" value="9" />

           if FDataToPost = '' then begin
              // Il y a obligatoirement déjà quelque chose dans FDataToPost
              FError := true;
              exit;
           end;

           CurrBalise := Attributes.Value('name');

           if SameText(CurrBalise, 'galaxy') then begin
              FDataToPost := FDataToPost + '&' + CurrBalise + '=' + CNT_FLOTTE2_IN_GALAXYCIBLE;

           end else if SameText(CurrBalise, 'system') then begin
              FDataToPost := FDataToPost + '&' + CurrBalise + '=' + CNT_FLOTTE2_IN_SYSTEMCIBLE;

           end else if SameText(CurrBalise, 'planet') then begin
              FDataToPost := FDataToPost + '&' + CurrBalise + '=' + CNT_FLOTTE2_IN_PLANETPOSCIBLE;

           end else begin
              // Input box inconnu...
              // On déclenche une erreur au lieu de la laisser à sa valeur par défaut
              FError := true;

           end;

        end;

        
    end else if FInForm and (TagName = 'select') then begin
        // Il y a deux select:
        //    celui pour la vitesse
        // et celui pour le type de la cible (lune, champs de ruine, planète)
        // <select name="planettype" onChange="shortInfo()" onKeyUp="shortInfo()">
        // <select name="speed" onChange="shortInfo()" onKeyUp="shortInfo()">

        if FDataToPost = '' then begin
           // Il y a obligatoirement déjà quelque chose dans FDataToPost
           FError := true;
           exit;
        end;

        CurrBalise := Attributes.Value('name');

        if SameText(CurrBalise, 'planettype') then begin
           FDataToPost := FDataToPost + '&' + CurrBalise + '=' +  CNT_FLOTTE2_IN_CIBLETYPE;

        end else if SameText(CurrBalise, 'speed') then begin
           FDataToPost := FDataToPost + '&' + CurrBalise + '=' +  CNT_FLOTTE2_IN_SPEEDRATIO;

        end else begin
           // Select inconnu... Nouvelle version du formulaire probablement ?
           // On déclenche une erreur
           FError := true;
        end;
        
    end;

    

end;

procedure TParsingFlotte2_ChoixDestination.ScanOnEndTag(Sender: TObject; TagName: string);
begin

    TagName := lowercase(TagName);

    if TagName = 'form' then begin
       FInForm := false;

    end;

end;

procedure TParsingFlotte2_ChoixDestination.ScanOnContent(Sender: TObject; Content: string);
begin
    // On a jamais besoin d'une chaine string de la page
end;

procedure TParsingFlotte2_ChoixDestination.Initialisation;
begin

    inherited;

    FError := false;

    FInForm := false;
    FDataToPost := '';
    FPageToPost := '';

end;

function TParsingFlotte2_ChoixDestination.GetFinalState: TParsingResultState;
begin
    Result := PRESULT_ECHEC;

    if FDataToPost = '' then begin
       exit;
    end;
    if FPageToPost = '' then begin
       exit;
    end;
    if FError then begin
       exit;
    end;
    if FSpeedFactor = '' then begin
       exit;
    end;


    
    Result := NoT(PRESULT_ECHEC);
end;



end.
